package com.wx.gof.pattern.creational.singleton;


/**
 * @ClassName Application
 * @Author wx
 * @Description 单例模式-懒汉(静态内部类，利用jvm初始化阶段的class对象锁)
 * @Date 2018-12-05
 */
public class StaticInnerClassSingleton {
    private static class InnerClass{
        private static StaticInnerClassSingleton staticInnerClassSingleton = new StaticInnerClassSingleton();
    }
    /**
     * 当我们创建实例 or 调用静态方法、静态非常量属性 or 反射 会触发初始化阶段，在进入初始化阶段会自动生成一把class对象锁
     * 初始化的过程就是给静态变量赋值、分配内存空间等等，当这一切做完之后就会释放锁，其他线程进来了就直接使用初始化好的静态资源
     * 这里不会有指令重排带来的问题，class对象锁保证了在对象静态资源没有初始化完毕之前其他线程是不能进来访问的，哪怕静态资源的指令顺序乱序也没关系
     * 反正其他线程也无法进来访问
     */
    public static StaticInnerClassSingleton getInstance(){
        return InnerClass.staticInnerClassSingleton;
    }
    private StaticInnerClassSingleton(){
        if(InnerClass.staticInnerClassSingleton != null){
            throw new RuntimeException("单例构造器禁止反射调用");
        }
    }
}
